כתבתי שעה ובטעות לחצתי "הוסף מדריך" :\ אז נתחיל מההתחלה...
אז ככה כתבתי פונקציה לבדיקה אם הדומיין קיים,עכשיו היא עושה קצת בעיות.
לדוגמא: לדומיין facebook.com היא מחזירה אמת אבל לדומיין www.facebook.com היא מחזירה שקר (חכה שניה, לא בגלל הסאב).
זאת הפונקציה:
function is_domain($domain){
  if(preg_match('@^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$@i', $domain)){
    $mxhosts = array();
    if(!function_exists('getmxrr') XOR getmxrr($domain, $mxhosts)){
      return true;
    }
  }
  return false;
}


זה הטסט:

$domains = array(
  'localhost', //false
  'www.phpguide.co.il', //true
  'sub.phpguide.co.il', //false
  'phpguide.co.il', //true
  'google.co', //false
  'google.com', //true
  'google.co.il', //true
  'google.foo', //false
  'mail.google.com', //true
  'my.google.com', //false
  'facebook.com', //true
  'www.facebook.com' //false
);

foreach($domains as $domain){
  echo "Domain: {$domain}, Matche: " . (is_domain($domain) ? 'TRUE' : 'FALSE') . '<br>';
}


למישהו יש רעיון למה זה קורה ואיך אפשר לסדר את זה? תודה.

3 תשובות

avatar ענה משתמש_110602 ב 18 לפברואר 2012 #

מדוע אתה משתמש ב- getmxrr? מן הסתם לחלק מהדומיינים אין MX record, אבל יש DNS record אחר - A או CNAME. לדוגמה אתה אני מריץ:

$ host -t mx www.facebook.com
www.facebook.com has no MX record

לעומת זאת אם אתה מריץ:
host  www.facebook.com
www.facebook.com has address 69.63.189.16


אתה צריך להשתמש ב- checkdnsrr

avatar ענה intval ב 18 לפברואר 2012 #

בנוסף לזה

א. לא אמור להיות פה XOR וPHP בכל זאת תנסה להפעיל את getmxarr גם אם היא לא קיימת
ב. כתבתי שעה ובטעות לחצתי "הוסף מדריך" :\ אז נתחיל מההתחלה... יטופל השבוע
ג. אתה תרוויח יותר אם תשתמש בפילטר ו parse_url כדי לנתח את הכתובת.

avatar ענה משתמש_112292 ב 19 לפברואר 2012 #

תודה רבה! עובד, השתמשתי בgetmxrr בגלל מדריך שראיתי פה לאימות אמייל.

$hosts = array(
  'http://localhost', //ture
  'http://www.phpguide.co.il', //true
  'http://sub.phpguide.co.il', //false
  'http://phpguide.co.il', //true
  'http://google.co', //ture
  'http://google.com', //true
  'http://google.co.il', //true
  'http://google.foo', //false
  'http://mail.google.com', //true
  'http://my.google.com', //false
  'http://facebook.com', //true
  'http://www.facebook.com' //ture
);

foreach($hosts as $host){
  echo "{$host} //" . (get_host($host) ? 'ture' : 'false') . "<br>\n";
}

function get_host($url){
  if(($parse_url = parse_url($url)) && isset($parse_url['scheme'], $parse_url['host']) && (!function_exists('checkdnsrr') || checkdnsrr($parse_url['host'], 'ANY'))){
    return "{$parse_url['scheme']}://{$parse_url['host']}/";
  }
  return false;
}